package com.gin.no_gay_alliance.utils;


import android.app.DownloadManager;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.widget.FrameLayout;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.content.res.ResourcesCompat;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import com.gin.nga.response.field.Attachment;
import com.gin.nga.utils.BitUtils;
import com.gin.no_gay_alliance.R;
import com.gin.no_gay_alliance.adpter.base.BaseBindingRecyclerViewAdapter;
import com.gin.no_gay_alliance.app.MyApplication;
import com.gin.no_gay_alliance.databinding.ItemPreviewContextMenuBinding;
import com.gin.no_gay_alliance.viewmodel.PreviewMenuItem;
import com.wgw.photo.preview.Config;
import com.wgw.photo.preview.IndicatorType;
import com.wgw.photo.preview.PhotoPreview;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 图片工具类
 *
 * @author : ginstone
 * @version : v1.0.0
 * @since : 2023/8/5 10:01
 **/
public class ImageUtils {
    public static final String TAG = ImageUtils.class.getSimpleName();

    /**
     * 加载论坛头像
     *
     * @param context   上下文
     * @param url       地址
     * @param imageView imageView
     */
    public static void loadForumAvatar(Context context, String url, ImageView imageView) {
//        Log.d(TAG, "加载论坛头像: " + url);
        // 加载版面头像
        Glide.with(context)
                //图片网址，或其他来源的图片
                .load(url)
                //图片请求错误时使用的占位图片
                .error(R.drawable.ic_forum_avatar)
                // 加载开始时的占位图片
                .placeholder(R.drawable.ic_forum_avatar)
                // 禁用硬盘缓存
//                .diskCacheStrategy(DiskCacheStrategy.NONE)
                // 设置时长2秒的渐变动画
//                .transition(DrawableTransitionOptions.withCrossFade(500))
                // 用于显示图片的 ImageView
                .into(imageView);
    }

    /**
     * 加载论坛头像
     *
     * @param context 上下文
     * @param url     地址
     * @param target  target
     */
    public static void loadForumAvatar(Context context, String url, TextViewTarget target) {
//        Log.d(TAG, "加载论坛头像: " + url);
        // 加载版面头像
        Glide.with(context)
                //图片网址，或其他来源的图片
                .load(url)
                //图片请求错误时使用的占位图片
                .error(R.drawable.ic_forum_avatar)
                // 加载开始时的占位图片
                .placeholder(R.drawable.ic_forum_avatar)
                // 禁用硬盘缓存
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                // 设置时长2秒的渐变动画
//                .transition(DrawableTransitionOptions.withCrossFade(500))
                // 用于显示图片的 ImageView
                .into(target);
    }


    /**
     * 加载用户头像
     *
     * @param context   上下文
     * @param url       地址
     * @param imageView imageView
     */
    public static void loadUserAvatar(Context context, String url, ImageView imageView) {
//        Log.d(TAG, "加载用户头像: " + url);
        Glide.with(context)
                //图片网址，或其他来源的图片
                .load(url)
                //图片请求错误时使用的占位图片
                .error(R.drawable.ic_forum_avatar)
                // 加载开始时的占位图片
                .apply(new RequestOptions().circleCrop()).placeholder(R.drawable.ic_forum_avatar)
                // 缓存转换后的图片
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                // 跳过内存缓存
//                .skipMemoryCache(true)
                // 设置时长2秒的渐变动画
//                .transition(DrawableTransitionOptions.withCrossFade(500))
                // 用于显示图片的 ImageView
                .into(imageView);

    }

    /**
     * 加载用户头像
     *
     * @param context 上下文
     * @param url     地址
     * @param target  imageView
     */
    public static void loadUserAvatar(Context context, String url, TextViewTarget target) {
//        Log.d(TAG, "加载用户头像: " + url);
        Glide.with(context)
                //图片网址，或其他来源的图片
                .load(url)
                //图片请求错误时使用的占位图片
                .error(R.drawable.ic_forum_avatar)
                // 加载开始时的占位图片
                .placeholder(R.drawable.ic_forum_avatar).apply(new RequestOptions().circleCrop())
                // 缓存转换后的图片
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                // 跳过内存缓存
//                .skipMemoryCache(true)
                // 设置时长2秒的渐变动画
//                .transition(DrawableTransitionOptions.withCrossFade(500))
                // 用于显示图片的 ImageView
                .into(target);

    }


    /**
     * 加载徽章
     *
     * @param context   上下文
     * @param url       地址
     * @param imageView imageView
     */
    public static void loadMedal(Context context, String url, ImageView imageView) {
        Glide.with(context)
                //图片网址，或其他来源的图片
                .load(url)
                // 缓存转换后的图片
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE).into(imageView);
    }

    public static void loadAttachment(Context context, String url, ImageView imageView) {
        Glide.with(context)
                //图片网址，或其他来源的图片
                .load(url).error(R.drawable.ic_broken_image_24).placeholder(R.drawable.ic_loading)
                // 缓存转换后的图片
                .diskCacheStrategy(DiskCacheStrategy.RESOURCE).into(imageView);
    }


    /**
     * 清空Glide的所有缓存
     *
     * @param context 上下文
     */
    public static void clearGlideCache(Context context) {
        Log.d(TAG, "清空Glide缓存");
        Glide.get(context).clearMemory();
        new Thread(() -> Glide.get(context).clearDiskCache()).start();
    }

    /**
     * 预览图片
     *
     * @param activity      activity
     * @param sources       图片url来源
     * @param position      默认位置
     * @param thumbnailView 点击触发预览的缩略图ImageView
     */
    public static <T extends PreviewSource> void preview(FragmentActivity activity, List<T> sources, int position, ImageView thumbnailView) {
        PhotoPreview.with(activity) // 打开预览的界面(缩略图所处界面)，预览生命周期与activity绑定
                .config(getPreviewConfig()) // 应用其它配置，以下配置覆盖此config中对应的属性
                .defaultShowPosition(position) // 默认预览的图片位置，用于多图预览
                .sources(sources) // 设置图片数据，有sources(Object...)和source(List)两个重载
                .onLongClickListener((p, customViewRoot, imageView) -> {
                    T source = sources.get(p);
                    String previewUrl = source.getPreviewUrl();
                    showDialogFromPreview(activity, previewUrl, imageView, customViewRoot);
                    return true;
                }).build().show(thumbnailView); // 展示预览，有show()、show(View)、show(IFindThumbnailView)三个重载
    }

    /**
     * 预览图片
     *
     * @param activity      activity
     * @param sources       图片url来源
     * @param position      默认位置
     * @param thumbnailView 点击触发预览的缩略图ImageView
     */
    public static void preview(FragmentActivity activity, ImageView thumbnailView, List<String> sources, int position) {
        PhotoPreview.with(activity) // 打开预览的界面(缩略图所处界面)，预览生命周期与activity绑定
                .config(getPreviewConfig()) // 应用其它配置，以下配置覆盖此config中对应的属性
                .defaultShowPosition(position) // 默认预览的图片位置，用于多图预览
                .sources(sources) // 设置图片数据，有sources(Object...)和source(List)两个重载
                .onLongClickListener((p, customViewRoot, imageView) -> {
                    String source = sources.get(p);
                    showDialogFromPreview(activity, source, imageView, customViewRoot);
                    return true;
                }).build().show(thumbnailView); // 展示预览，有show()、show(View)、show(IFindThumbnailView)三个重载
    }


    /**
     * 在正文中预览图片
     *
     * @param activity   activity
     * @param previewUrl 预览图片地址
     */
    public static void preview(FragmentActivity activity, String previewUrl) {
        PhotoPreview.with(activity) // 打开预览的界面(缩略图所处界面)，预览生命周期与activity绑定
                .config(getPreviewConfig()) // 应用其它配置，以下配置覆盖此config中对应的属性
                .sources(previewUrl) // 设置图片数据，有sources(Object...)和source(List)两个重载
                .onLongClickListener((p, customViewRoot, imageView) -> {
                    showDialogFromPreview(activity, previewUrl, imageView, customViewRoot);
                    return true;
                }).build().show(); // 展示预览，有show()、show(View)、show(IFindThumbnailView)三个重载
    }

    public static Config getPreviewConfig() {
        Resources resources = MyApplication.app.getResources();
        Resources.Theme theme = MyApplication.app.getTheme();

        Config config = new Config();
        //图片指示器类型(目前只有圆点和文本)，预览>=2张图片时有效
        config.indicatorType = IndicatorType.DOT;
        // indicatorType为DOT时，设置DOT最大数量，如果sources数量超过此值，则改用IndicatorType.TEXT
        config.maxIndicatorDot = 9;
        // 指示当前预览界面指示器颜色
        config.selectIndicatorColor = ResourcesCompat.getColor(resources, R.color.yellow_dark, theme);
        // 非当前预览界面指示器颜色
        config.normalIndicatorColor = ResourcesCompat.getColor(resources, R.color.yellow_light, theme);
        // 图片加载loading color, android5.0(含)之后有效
        config.progressColor = ResourcesCompat.getColor(resources, R.color.yellow_dark, theme);
        // 全屏预览
        config.fullScreen = true;
        // 是否展示缩略图蒙层，如果设置为true,则预览动画执行时,缩略图不显示，预览更沉浸
        config.showThumbnailViewMask = true;
        // 是否在打开预览动画执行开始的时候执行状态栏隐藏/显示操作
        config.openAnimStartHideOrShowStatusBar = true;
        // 动画时间，null：使用默认时间，<=0: 不执行动画
        config.animDuration = 400L;
        return config;
    }

    /**
     * 删除缩略图后缀
     *
     * @param url url
     * @return 原图地址
     */
    public static String removeSuffix(String url) {
        String u = url;
        for (Map.Entry<Integer, String> entry : BitUtils.THUMB_MAP.entrySet()) {
            String s = entry.getValue();
            if (u.endsWith(s)) {
                u = u.replace(s, "");
            }
        }
        return u;
    }

    /**
     * 长按预览图时弹窗选择后续操作
     *
     * @param context        活动
     * @param previewUrl     预览地址
     * @param imageView
     * @param customViewRoot
     */
    private static void showDialogFromPreview(Context context, String previewUrl, ImageView imageView, FrameLayout customViewRoot) {
        // 用来激活上下文菜单的view
        RecyclerView rv = new RecyclerView(context);
        rv.setLayoutManager(new LinearLayoutManager(context));
        List<PreviewMenuItem> menuItems = new ArrayList<>();
        menuItems.add(new PreviewMenuItem(R.id.menu_item_save, R.drawable.ic_save_24, "保存原图"));
        menuItems.add(new PreviewMenuItem(R.id.menu_item_copy_link, R.drawable.ic_copy_24, "复制链接"));
        menuItems.add(new PreviewMenuItem(R.id.menu_item_copy_bbs_code, R.drawable.ic_copy_24, "复制论坛代码"));

        AlertDialog dialog = AlertDialogUtils.showConfirm(context, "选择执行的操作", null, rv, null);

        rv.setAdapter(new BaseBindingRecyclerViewAdapter<ItemPreviewContextMenuBinding, PreviewMenuItem>(context, menuItems) {
            @Override
            protected void onBindViewHolder(ViewHolder<ItemPreviewContextMenuBinding> holder, @NonNull ItemPreviewContextMenuBinding b, int position, PreviewMenuItem item) {
                Drawable drawable = ResourcesCompat.getDrawable(context.getResources(), item.drawableId, context.getTheme());
                assert drawable != null;
                drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
                b.getRoot().setText(item.title);
                b.getRoot().setId(item.id);
                b.getRoot().setCompoundDrawables(drawable, null, null, null);
                b.getRoot().setOnClickListener(v -> {
                    // 下载原图
                    if (item.id == R.id.menu_item_save) {
                        String url = previewUrl;
                        // 删除后缀
                        url = removeSuffix(url);

                        String filename = url.substring(url.lastIndexOf("/") + 1);
                        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
                        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "no_gay/" + filename);
                        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                        DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
                        downloadManager.enqueue(request);
                        handler.toast("开始下载");
                    }
                    // 复制链接
                    if (item.id == R.id.menu_item_copy_link) {
                        ClipboardUtils.setText(context, previewUrl);
                    }
                    // 复制BbsCode
                    if (item.id == R.id.menu_item_copy_bbs_code) {
                        String text = previewUrl.startsWith(Attachment.PREFIX) ? previewUrl.replace(Attachment.PREFIX, "./") : previewUrl;
                        ClipboardUtils.setText(context, String.format("[img]%s[/img]", text));
                    }
                    dialog.dismiss();
                });
            }

            @NonNull
            @Override
            protected ItemPreviewContextMenuBinding buildBinding(LayoutInflater inflater) {
                return ItemPreviewContextMenuBinding.inflate(inflater);
            }
        });


        //下载
        //复制地址
        //复制BbsCode
    }

    /**
     * 预览来源
     */
    public interface PreviewSource {
        String getPreviewUrl();
    }
}
